package xy.redis.util;

import org.springframework.data.redis.connection.RedisZSetCommands;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Set;

/**
 * @Classname RedisUtil
 * @Description TODO
 * @Date 2023/7/17 09:20
 * @Created by wangxianlin
 */
@Component
public class ZSetRedisUtil {

    @Resource
    RedisTemplate redisTemplate;

    // ZSET

    /**
     * 新增
     * @param key
     * @param value
     * @param score
     * @return
     */
    public  boolean zAdd(String key,Object value,double score){
       return  redisTemplate.opsForZSet().add(key,value,score);
    }

    /**
     * 返回 成员中的score值
     * @param key
     * @param value
     * @return
     */
    public  double zScore(String key,Object value){
       return redisTemplate.opsForZSet().score(key,value);
    }

    /**
     * 为有序集key的成员member的score值加上增量increment
     * @param key
     * @param value
     * @param score
     * @return
     */
    public  double zIncrBy(String key,Object value,double score){
        return redisTemplate.opsForZSet().incrementScore(key,value,score);
    }

    /**
     * 返回key 对应的value 个数
     * @param key
     * @return
     */
    public  Long zCard(String key){
        return redisTemplate.opsForZSet().zCard(key);
    }

    /**
     * 返回有序集 key 中， score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
     * @param key 键
     * @param min score 最小 指的是范围
     * @param max score 最大 指的是范围
     * @return
     */
    public  long zCount(String key,double min,double max){
       return redisTemplate.opsForZSet().count(key,min,max);
    }

    /**
     * 返回有序集 key 中，指定区间内的成员。
     * 其中成员的位置按 score 值递增(从小到大)来排序。
     * @param key
     * @param s1
     * @param s2
     */
    public Set zRange(String key, long s1, long s2){
        return redisTemplate.opsForZSet().range(key,s1,s2);
    }

    /**
     * 返回有序集 key 中，指定区间内的成员。
     * 其中成员的位置按 score 值递减(从大到小)来排列。
     * @param key
     * @param s1 指的是区间位置
     * @param s2 指的是区间位置
     */
    public  Set zRevRange(String key, long s1, long s2){
        return redisTemplate.opsForZSet().reverseRange(key,s1,s2);
    }

    /**
     * 返回有序集 key 中，所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
     * 有序集成员按 score 值递增(从小到大)次序排列
     * @param key
     * @param s1
     * @param s2
     * @return
     */
    public  Set zRangeByScore(String key, long s1, long s2){
        return redisTemplate.opsForZSet().rangeByScore(key,s1,s2);
    }

    public Set zRangeByLex(String key, RedisZSetCommands.Range range){
        return redisTemplate.opsForZSet().rangeByLex(key,range);
    }

    public void zLexCount(){

    }

    public void zRemRangeByLex(){

    }


    public void zScan(){

    }


    public void zIUnionStore(){

    }

    public void zInterStore(){

    }

}
